package org.example.backend.service.impl;

import org.example.backend.bean.Video;
import org.example.backend.common.Result;
import org.example.backend.dto.VideoDTO;
import org.example.backend.mapper.VideoMapper;
import org.example.backend.service.VideoChunkService;
import org.example.backend.service.VideoService;
import org.example.backend.utils.FfmpegUtils;
import org.example.backend.utils.FileUtils;
import org.example.backend.utils.JwtUtils;
import org.example.backend.utils.MinioUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 啊昌
 * @date 2025/7/20 11:04
 * VideoServiceImpl 视频实体类
 */
@Service
public class VideoServiceImpl implements VideoService {

	@Autowired
	private VideoMapper videoMapper;
	@Autowired
	private FileUtils fileUtils;
	@Autowired
	private JwtUtils jwtUtils;
	@Autowired
	private MinioUtil minioUtil;
	@Autowired
	private FfmpegUtils ffmpegUtils;

	@Autowired
	private VideoChunkService videoChunkService;

	/**
	 * 获取所有视频信息
	 *
	 * @return 包含所有视频信息的 Result 对象
	 */
	@Override
	public Result<Map<String, Object>> getAllVideo() {
		List<Video> videos = videoMapper.selectList(null);
		Map<String, Object>  map = new HashMap<>();
		map.put("video", videos);
		return Result.success(map);
	}


	@Override
	public Result<Map<String, Object>> uploadVideo(MultipartFile multipartFile) throws Exception {
		Long userID = jwtUtils.getUserIdFromToken();
		Map<String, Object> map = new HashMap<>();
		//1. 进行视频的转码。。返回MultipartFile对象
//		MultipartFile convertToMp4MultipartFile = ffmpegUtils.convertToMp4MultipartFile(multipartFile); //完成对视频的md4转码
//		String fileMD5 = fileUtils.calculateMD5(convertToMp4MultipartFile);//获取当前上传文档的md5
		String fileMD5 = fileUtils.calculateMD5(multipartFile);
		try {
			fileUtils.splitFileToDB(multipartFile, userID.toString(), fileMD5);//进行分片、合并、删除分片、生成缩咧图
			//构建数据返回前端
			String bucketName = String.valueOf(userID);
			String filename = multipartFile.getOriginalFilename();
			String VideoObjectName = fileMD5 + "/chunk/" + filename; //文件md5 + chunk +文件名
			String ThumbnailObjectName = fileMD5 + "/thumbnail/" + filename.substring(0, filename.lastIndexOf(".")) + ".jpg"; //文件md5 + chunk +文件名
			String minioVideoUrl = minioUtil.getPreviewFileUrl(bucketName, VideoObjectName); //视频的url
			String minioImgUrl = minioUtil.getPreviewFileUrl(bucketName, ThumbnailObjectName); //缩例图
			map.put("minioVideoUrl", minioVideoUrl);
			map.put("minioImgUrl", minioImgUrl);
		} catch (Exception e) {
			return Result.error(e.getMessage());
		}
		return Result.success(map);
	}

	/**
	 * 上传视频文件到服务器
	 *
	 * @param multipartFile 视频文件
	 * @return 包含视频和缩略图URL的结果对象
	 * @throws Exception 抛出异常
	 */
//	@Override
//	public Result<Map<String, Object>> uploadVideo(MultipartFile multipartFile) throws Exception {
//		Long userID = jwtUtils.getUserIdFromToken();
//		Map<String, Object>  map= new HashMap<>();
//		//1. 进行视频的转码。。返回MultipartFile对象
//		MultipartFile convertToMp4MultipartFile = ffmpegUtils.convertToMp4MultipartFile(multipartFile); //完成对视频的md4转码
//		String fileMD5 = fileUtils.calculateMD5(convertToMp4MultipartFile);//获取当前上传文档的md5
//
//		try {
//			//todo 进行分片,但是还没保留在数据库，也没有处理转码问题。 存储在数据库，从数据库拿到定时任务，xxl-job任务处理，还要注意幂等性【重复消费】
//			fileUtils.splitFile(convertToMp4MultipartFile, userID.toString()); //进行分片、合并、删除分片、生成缩咧图
//			//将分片保存在数据库
//			String bucketName = String.valueOf(userID);
//			String filename = multipartFile.getOriginalFilename();
//			String VideoObjectName = fileMD5 +"/chunk/"+ filename; //文件md5 + chunk +文件名
//			String ThumbnailObjectName = fileMD5 +"/thumbnail/"+ filename.substring(0, filename.lastIndexOf("."))+".jpg"; //文件md5 + chunk +文件名
//			String minioVideoUrl = minioUtil.getPreviewFileUrl(bucketName, VideoObjectName); //视频的url
//			String minioImgUrl = minioUtil.getPreviewFileUrl(bucketName, ThumbnailObjectName); //缩例图
//			map.put("minioVideoUrl", minioVideoUrl);
//			map.put("minioImgUrl", minioImgUrl);
//		} catch (Exception e) {
//			return  Result.error(e.getMessage());
//		}
//		return Result.success(map);
//	}

	@Override
	public Result<Map<String, Object>> uploadVideoMessages(VideoDTO videoDTO) {
		return null;
	}
}
